package cn.tedu.order.tcc;


import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

import java.math.BigDecimal;

/**
 * 订单的 TCC 操作接口
 * 在接口上添加配置:
 *     1. @LocalTCC
 *     2. TCC三个方法
 *     3. 在第一阶段方法上,添加@TwoPhaseBusinessAction
 *     4. @TwoPhaseBusinessAction注解属性配置两个第二阶段方法
 *         - commitMethod="commit"
 *         - rollbackMethod="rollback"
 *     5. 三个方法都添加 BusinessActionContext 参数
 *     6. 在第一阶段方法上添加业务数据参数
 *     7. 需要向第二阶段传递的数据,添加 @BusinessActionContextParameter
 */

@LocalTCC
public interface OrderTccAction {
    /**
     * 为了避开seata的一个bug,不传递封装到Order对象,
     * 而是把数据打散,一个一个地单独传递
     */
    @TwoPhaseBusinessAction(
            name = "OrderTccAction",
            commitMethod = "commit",
            rollbackMethod = "rollback"
    )
    boolean prepare(BusinessActionContext ctx,
                    @BusinessActionContextParameter(paramName = "orderId")
                    Long orderId,
                    Long userId,
                    Long productId,
                    Integer count,
                    BigDecimal money);
    boolean commit(BusinessActionContext ctx);
    boolean rollback(BusinessActionContext ctx);
}
